package com.cskaoyan.keyfinally;

/*
       try{

       } catch() {

       }
       ...
       catch() {

       } finally {

       }

       finally的特点： 必执行
        a. 被finally控制的语句体一定会执行
           1) try 中的代码正常执行
           2）try块中的代码发生异常
           3）在try块中在执行finally代码块之前，先执行return

        b. 特殊情况：在执行到finally之前jvm退出了(比如System.exit(0))

        finally的作用
            用于释放资源，在IO流操作和数据库操作中会见到


       finally相关的面试题
            1.final，finally和finalize的区别(简单题)
            2.如果catch里面有return语句，请问finally的代码还会执行吗? catch中可以执行return，finally也会执行
                如果会，请问是在return前还是return后。


 */
public class Demo1 {

    public static void main(String[] args) {
        // 测试finally代码块必执行的特征
        //testFinally();

        // finally代码块的使用场景
        //handleResource();


        int i = interview();
        System.out.println(i); //20


    }

    public static int interview() {
        int i = 10;
        try {
            int j = 0;
            int result;
            // 除零异常
            result = i / j;
        } catch (Exception e) {
            i = 20;
            return i;
        } finally {
            System.out.println("finally");
           i = 100;
        }
        return i;
    }

    private static void handleResource() {
        try {
            // 获取了一些系统资源
            // 使用资源，处理业务逻辑
        } catch (Exception e) {

        } finally {
            //释放资源
        }
    }

    private static void testFinally() {
        try {
            int i = 1;
            int j = 0;
            // 这里会出现除零异常
            //int result = i / j;

            // 在finally代码块之前执行了return语句，finally代码块还是会执行
            //return;

            // 中止jvm的执行
            System.exit(0);

        } catch (Exception e) {
            System.out.println("发生了异常");
        } finally {
            System.out.println("finally");
        }
    }
}
